home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-06-16 | 19.5 KB | 606 lines | [TEXT/MSWD] |
- // MacTech Magazine Programmers' Challenge
- // May, 1994
- // Submitted by Troy Anderson
- //
- // Copyright (c) 1994 Troy L. Anderson
-
- #include <QDOffscreen.h>
-
- typedef unsigned char UCHAR;
-
- // prototypes
- void FlipPixMapHorz( PixMapHandle thePixMapHndl);
-
- static void Flip_Long( PixMapHandle theMap,
- short rowBytes,
- short depth,
- Rect* area);
-
- static void Flip_Word( PixMapHandle theMap,
- short rowBytes,
- short depth,
- Rect* area);
-
- static void ExchangeWords_Long( PixMapHandle theMap,
- short rowBytes,
- short depth,
- Rect* area);
-
- static void ExchangeWords_Word( PixMapHandle theMap,
- short rowBytes,
- short depth,
- Rect* area);
-
- static void ExchangeWords_Byte( PixMapHandle theMap,
- short rowBytes,
- short depth,
- Rect* area);
-
-
- // This could be made a bit faster by in-lining the
- // functions, but this is much clearer, and not
- // very much slower.
- void FlipPixMapHorz( PixMapHandle thePixMapHndl)
- {
- short rowBytes = (**thePixMapHndl).rowBytes & 0x7fff;
- Boolean longAligned = rowBytes % 4 == 0;
- short depth = (**thePixMapHndl).pixelSize;
- Rect bounds = (**thePixMapHndl).bounds;
-
- switch( depth)
- {
- case 1:
- case 2:
- case 4:
- if (longAligned)
- Flip_Long( thePixMapHndl,
- rowBytes,
- depth,
- &bounds);
- else
- Flip_Word( thePixMapHndl,
- rowBytes,
- depth,
- &bounds);
- break;
-
- case 8:
- ExchangeWords_Byte( thePixMapHndl,
- rowBytes,
- depth,
- &bounds);
- break;
-
- case 16:
- ExchangeWords_Word( thePixMapHndl,
- rowBytes,
- depth,
- &bounds);
- break;
-
- case 32:
- ExchangeWords_Long( thePixMapHndl,
- rowBytes,
- depth,
- &bounds);
- break;
- }
- }
-
-
-
- // ExchangeWords - long word alignment version
- static void ExchangeWords_Long( PixMapHandle theMap,
- short rowBytes,
- short depth,
- Rect* area)
- {
- #undef T
- #define T long
-
- short rowCells = rowBytes / sizeof(T);
- short numCells = ((area->right - area->left) *
- depth + sizeof(T)*8 - 1) /
- (sizeof(T)*8);
- T temp;
- register T *cellPtr1, *cellPtr2;
- T *aRow;
- T *firstRow = (T*)GetPixBaseAddr( theMap);
- T *lastRow = firstRow + rowCells *
- (long)(area->bottom - area->top);
-
- // Flip the words in each row
- for ( aRow = firstRow; aRow < lastRow; aRow += rowCells)
- for ( cellPtr1 = aRow + numCells-1, cellPtr2 = aRow;
- cellPtr1 > cellPtr2;
- cellPtr1--, cellPtr2++)
- temp = *cellPtr1, // swap them
- *cellPtr1 = *cellPtr2,
- *cellPtr2 = temp;
- }
-
-
-
- // ExchangeWords - word alignment version
- static void ExchangeWords_Word( PixMapHandle theMap,
- short rowBytes,
- short depth,
- Rect* area)
- {
- #undef T
- #define T short
-
- short rowCells = rowBytes / sizeof(T);
- short numCells = ((area->right - area->left) *
- depth + sizeof(T)*8 - 1) /
- (sizeof(T)*8);
- T temp;
- register T *cellPtr1, *cellPtr2;
- T *aRow;
- T *firstRow = (T*)GetPixBaseAddr( theMap);
- T *lastRow = firstRow + rowCells *
- (long)(area->bottom - area->top);
-
- // Flip the words in each row
- for ( aRow = firstRow; aRow < lastRow; aRow += rowCells)
- for ( cellPtr1 = aRow + numCells-1, cellPtr2 = aRow;
- cellPtr1 > cellPtr2;
- cellPtr1--, cellPtr2++)
- temp = *cellPtr1, // swap them
- *cellPtr1 = *cellPtr2,
- *cellPtr2 = temp;
- }
-
-
-
- // ExchangeWords - byte alignment version
- static void ExchangeWords_Byte( PixMapHandle theMap,
- short rowBytes,
- short depth,
- Rect* area)
- {
- #undef T
- #define T char
-
- short rowCells = rowBytes / sizeof(T);
- short numCells = ((area->right - area->left) *
- depth + sizeof(T)*8 - 1) /
- (sizeof(T)*8);
- T temp;
- register T *cellPtr1, *cellPtr2;
- T *aRow;
- T *firstRow = (T*)GetPixBaseAddr( theMap);
- T *lastRow = firstRow + rowCells *
- (long)(area->bottom - area->top);
-
- // Flip the words in each row
- for ( aRow = firstRow; aRow < lastRow; aRow += rowCells)
- for ( cellPtr1 = aRow + numCells-1, cellPtr2 = aRow;
- cellPtr1 > cellPtr2;
- cellPtr1--, cellPtr2++)
- temp = *cellPtr1, // swap them
- *cellPtr1 = *cellPtr2,
- *cellPtr2 = temp;
- }
-
-
-
- // Inverse tables used to flip the bits in a byte -
- // index is input, value is inverse of index
-
- // This is the 1-bit per pixel table
- static char byteFlips1[] ={
- 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
- 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
- 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
- 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
- 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
- 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
- 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
- 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
- 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
- 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
- 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
- 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
- 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
- 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
- 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
- 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
- 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
- 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
- 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
- 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
- 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
- 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
- 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
- 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
- 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
- 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
- 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
- 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
- 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
- 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
- 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
- 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff };
-
- // This is the 2-bits per pixel table
- static char byteFlips2[] ={
- 0x00, 0x40, 0x80, 0xc0, 0x10, 0x50, 0x90, 0xd0,
- 0x20, 0x60, 0xa0, 0xe0, 0x30, 0x70, 0xb0, 0xf0,
- 0x04, 0x44, 0x84, 0xc4, 0x14, 0x54, 0x94, 0xd4,
- 0x24, 0x64, 0xa4, 0xe4, 0x34, 0x74, 0xb4, 0xf4,
- 0x08, 0x48, 0x88, 0xc8, 0x18, 0x58, 0x98, 0xd8,
- 0x28, 0x68, 0xa8, 0xe8, 0x38, 0x78, 0xb8, 0xf8,
- 0x0c, 0x4c, 0x8c, 0xcc, 0x1c, 0x5c, 0x9c, 0xdc,
- 0x2c, 0x6c, 0xac, 0xec, 0x3c, 0x7c, 0xbc, 0xfc,
- 0x01, 0x41, 0x81, 0xc1, 0x11, 0x51, 0x91, 0xd1,
- 0x21, 0x61, 0xa1, 0xe1, 0x31, 0x71, 0xb1, 0xf1,
- 0x05, 0x45, 0x85, 0xc5, 0x15, 0x55, 0x95, 0xd5,
- 0x25, 0x65, 0xa5, 0xe5, 0x35, 0x75, 0xb5, 0xf5,
- 0x09, 0x49, 0x89, 0xc9, 0x19, 0x59, 0x99, 0xd9,
- 0x29, 0x69, 0xa9, 0xe9, 0x39, 0x79, 0xb9, 0xf9,
- 0x0d, 0x4d, 0x8d, 0xcd, 0x1d, 0x5d, 0x9d, 0xdd,
- 0x2d, 0x6d, 0xad, 0xed, 0x3d, 0x7d, 0xbd, 0xfd,
- 0x02, 0x42, 0x82, 0xc2, 0x12, 0x52, 0x92, 0xd2,
- 0x22, 0x62, 0xa2, 0xe2, 0x32, 0x72, 0xb2, 0xf2,
- 0x06, 0x46, 0x86, 0xc6, 0x16, 0x56, 0x96, 0xd6,
- 0x26, 0x66, 0xa6, 0xe6, 0x36, 0x76, 0xb6, 0xf6,
- 0x0a, 0x4a, 0x8a, 0xca, 0x1a, 0x5a, 0x9a, 0xda,
- 0x2a, 0x6a, 0xaa, 0xea, 0x3a, 0x7a, 0xba, 0xfa,
- 0x0e, 0x4e, 0x8e, 0xce, 0x1e, 0x5e, 0x9e, 0xde,
- 0x2e, 0x6e, 0xae, 0xee, 0x3e, 0x7e, 0xbe, 0xfe,
- 0x03, 0x43, 0x83, 0xc3, 0x13, 0x53, 0x93, 0xd3,
- 0x23, 0x63, 0xa3, 0xe3, 0x33, 0x73, 0xb3, 0xf3,
- 0x07, 0x47, 0x87, 0xc7, 0x17, 0x57, 0x97, 0xd7,
- 0x27, 0x67, 0xa7, 0xe7, 0x37, 0x77, 0xb7, 0xf7,
- 0x0b, 0x4b, 0x8b, 0xcb, 0x1b, 0x5b, 0x9b, 0xdb,
- 0x2b, 0x6b, 0xab, 0xeb, 0x3b, 0x7b, 0xbb, 0xfb,
- 0x0f, 0x4f, 0x8f, 0xcf, 0x1f, 0x5f, 0x9f, 0xdf,
- 0x2f, 0x6f, 0xaf, 0xef, 0x3f, 0x7f, 0xbf, 0xff };
-
- // This is the 4-bits per pixel table
- static char byteFlips4[] ={
- 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
- 0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0,
- 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,
- 0x81, 0x91, 0xa1, 0xb1, 0xc1, 0xd1, 0xe1, 0xf1,
- 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,
- 0x82, 0x92, 0xa2, 0xb2, 0xc2, 0xd2, 0xe2, 0xf2,
- 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,
- 0x83, 0x93, 0xa3, 0xb3, 0xc3, 0xd3, 0xe3, 0xf3,
- 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,
- 0x84, 0x94, 0xa4, 0xb4, 0xc4, 0xd4, 0xe4, 0xf4,
- 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,
- 0x85, 0x95, 0xa5, 0xb5, 0xc5, 0xd5, 0xe5, 0xf5,
- 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,
- 0x86, 0x96, 0xa6, 0xb6, 0xc6, 0xd6, 0xe6, 0xf6,
- 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,
- 0x87, 0x97, 0xa7, 0xb7, 0xc7, 0xd7, 0xe7, 0xf7,
- 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,
- 0x88, 0x98, 0xa8, 0xb8, 0xc8, 0xd8, 0xe8, 0xf8,
- 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,
- 0x89, 0x99, 0xa9, 0xb9, 0xc9, 0xd9, 0xe9, 0xf9,
- 0x0a, 0x1a, 0x2a, 0x3a, 0x4a, 0x5a, 0x6a, 0x7a,
- 0x8a, 0x9a, 0xaa, 0xba, 0xca, 0xda, 0xea, 0xfa,
- 0x0b, 0x1b, 0x2b, 0x3b, 0x4b, 0x5b, 0x6b, 0x7b,
- 0x8b, 0x9b, 0xab, 0xbb, 0xcb, 0xdb, 0xeb, 0xfb,
- 0x0c, 0x1c, 0x2c, 0x3c, 0x4c, 0x5c, 0x6c, 0x7c,
- 0x8c, 0x9c, 0xac, 0xbc, 0xcc, 0xdc, 0xec, 0xfc,
- 0x0d, 0x1d, 0x2d, 0x3d, 0x4d, 0x5d, 0x6d, 0x7d,
- 0x8d, 0x9d, 0xad, 0xbd, 0xcd, 0xdd, 0xed, 0xfd,
- 0x0e, 0x1e, 0x2e, 0x3e, 0x4e, 0x5e, 0x6e, 0x7e,
- 0x8e, 0x9e, 0xae, 0xbe, 0xce, 0xde, 0xee, 0xfe,
- 0x0f, 0x1f, 0x2f, 0x3f, 0x4f, 0x5f, 0x6f, 0x7f,
- 0x8f, 0x9f, 0xaf, 0xbf, 0xcf, 0xdf, 0xef, 0xff };
-
-
-
- static void Flip_Long( PixMapHandle theMap,
- short rowBytes,
- short depth,
- Rect* area)
- {
- #undef T
- #define T long
-
- register UCHAR temp;
- short rowCells = rowBytes / sizeof(T);
- long bitsPerRow = (area->right - area->left) *
- (long)depth - 1;
- short numCells = (bitsPerRow + sizeof(T)*8) /
- (sizeof(T)*8);
- T* cellPtr;
- T* aRow;
- T* firstRow = (T*)GetPixBaseAddr( theMap);
- T* lastRow = firstRow + rowCells *
- (long)(area->bottom - area->top);
-
- register T* cellPtr1, *cellPtr2;
-
- short numBitsToShift = ((sizeof(T)*8) -
- (bitsPerRow % (sizeof(T)*8) + 1));
- T shiftMask;
- T* shiftCellPtr;
- char* flipTable;
-
-
-
- switch(depth)
- {
- case 1:
- flipTable = byteFlips1;
- break;
- case 2:
- flipTable = byteFlips2;
- break;
- case 4:
- flipTable = byteFlips4;
- break;
- }
-
-
- if (numBitsToShift)
- {
- shiftMask = (1L << numBitsToShift) - 1;
-
- for ( aRow = firstRow;
- aRow < lastRow;
- aRow += rowCells)
- {
- // With each pair of cells in the row
- // (one on the left, the other on the right),
- // flip the pixels in the individual cells
- // and swap the cells with oneanother.
- for ( cellPtr1 = aRow + numCells - 1, cellPtr2 = aRow;
- cellPtr1 > cellPtr2;
- cellPtr1--, cellPtr2++)
- {
- temp = ((UCHAR*)cellPtr1)[0];
- ((UCHAR*)cellPtr1)[0] =
- flipTable[((UCHAR*)cellPtr2)[3]];
- ((UCHAR*)cellPtr2)[3] = flipTable[temp];
-
- temp = ((UCHAR*)cellPtr1)[1];
- ((UCHAR*)cellPtr1)[1] =
- flipTable[((UCHAR*)cellPtr2)[2]];
- ((UCHAR*)cellPtr2)[2] = flipTable[temp];
-
- temp = ((UCHAR*)cellPtr1)[2];
- ((UCHAR*)cellPtr1)[2] =
- flipTable[((UCHAR*)cellPtr2)[1]];
- ((UCHAR*)cellPtr2)[1] = flipTable[temp];
-
- temp = ((UCHAR*)cellPtr1)[3];
- ((UCHAR*)cellPtr1)[3] =
- flipTable[((UCHAR*)cellPtr2)[0]];
- ((UCHAR*)cellPtr2)[0] = flipTable[temp];
- }
-
- // If there's an odd number of cells in the row,
- // there is one cell we haven't touched.
- // It needs to be flipped.
- if (cellPtr1 == cellPtr2)
- {
- temp = ((UCHAR*)cellPtr1)[0];
- ((UCHAR*)cellPtr1)[0] =
- flipTable[((UCHAR*)cellPtr1)[3]];
- ((UCHAR*)cellPtr1)[3] = flipTable[temp];
-
- temp = ((UCHAR*)cellPtr1)[1];
- ((UCHAR*)cellPtr1)[1] =
- flipTable[((UCHAR*)cellPtr1)[2]];
- ((UCHAR*)cellPtr1)[2] = flipTable[temp];
- }
-
- // Slide the pixels to the left
- for ( shiftCellPtr = aRow;
- shiftCellPtr < aRow + rowCells;
- shiftCellPtr++)
- {
- // shift the bits over
- *shiftCellPtr <<= numBitsToShift;
-
- // bring in the bits from the next cell -
- // garbage will be brought in during last
- // iteration, but its put into the last
- // cell, outside the bounds of the image
- // (but still in the data area)
- *shiftCellPtr |= shiftMask &
- (*(shiftCellPtr+1) >>
- (sizeof(T)*8 - numBitsToShift));
- }
- }
- }
- else // no need to shift pixels, otherwise,
- { // just the same as previous loop
- for ( aRow = firstRow; aRow < lastRow; aRow += rowCells)
- {
- // With each pair of cells in the row (one on the
- // left, the other on the right), flip the pixels
- // in the individual cells and swap the cells with
- // one another.
- for ( cellPtr1 = aRow + numCells - 1, cellPtr2 = aRow;
- cellPtr1 > cellPtr2;
- cellPtr1--, cellPtr2++)
- {
- temp = ((UCHAR*)cellPtr1)[0];
- ((UCHAR*)cellPtr1)[0] =
- flipTable[((UCHAR*)cellPtr2)[3]];
- ((UCHAR*)cellPtr2)[3] = flipTable[temp];
-
- temp = ((UCHAR*)cellPtr1)[1];
- ((UCHAR*)cellPtr1)[1] =
- flipTable[((UCHAR*)cellPtr2)[2]];
- ((UCHAR*)cellPtr2)[2] = flipTable[temp];
-
- temp = ((UCHAR*)cellPtr1)[2];
- ((UCHAR*)cellPtr1)[2] =
- flipTable[((UCHAR*)cellPtr2)[1]];
- ((UCHAR*)cellPtr2)[1] = flipTable[temp];
-
- temp = ((UCHAR*)cellPtr1)[3];
- ((UCHAR*)cellPtr1)[3] =
- flipTable[((UCHAR*)cellPtr2)[0]];
- ((UCHAR*)cellPtr2)[0] = flipTable[temp];
- }
-
- // If there are an odd number of cells in the row,
- // there is one cell we haven't touched.
- // It needs to be flipped.
- if (cellPtr1 == cellPtr2)
- {
- temp = ((UCHAR*)cellPtr1)[0];
- ((UCHAR*)cellPtr1)[0] =
- flipTable[((UCHAR*)cellPtr1)[3]];
- ((UCHAR*)cellPtr1)[3] = flipTable[temp];
-
- temp = ((UCHAR*)cellPtr1)[1];
- ((UCHAR*)cellPtr1)[1] =
- flipTable[((UCHAR*)cellPtr1)[2]];
- ((UCHAR*)cellPtr1)[2] = flipTable[temp];
- }
- }
- }
- }
-
-
-
-
-
- static void Flip_Word( PixMapHandle theMap,
- short rowBytes,
- short depth,
- Rect* area)
- {
- #undef T
- #define T short
-
- register UCHAR temp;
- short rowCells = rowBytes / sizeof(T);
- long bitsPerRow = (area->right - area->left) *
- (long)depth - 1;
- short numCells = (bitsPerRow + sizeof(T)*8) /
- (sizeof(T)*8);
- T* cellPtr;
- T* aRow;
- T* firstRow = (T*)GetPixBaseAddr( theMap);
- T* lastRow = firstRow + rowCells *
- (long)(area->bottom - area->top);
-
- register T* cellPtr1, *cellPtr2;
-
- short numBitsToShift = ((sizeof(T)*8) -
- (bitsPerRow % (sizeof(T)*8) + 1));
- T shiftMask;
- T* shiftCellPtr;
- char* flipTable;
-
-
-
- switch(depth)
- {
- case 1:
- flipTable = byteFlips1;
- break;
- case 2:
- flipTable = byteFlips2;
- break;
- case 4:
- flipTable = byteFlips4;
- break;
- }
-
-
- if (numBitsToShift)
- {
- shiftMask = (1L << numBitsToShift) - 1;
-
- for ( aRow = firstRow; aRow < lastRow; aRow += rowCells)
- {
- // With each pair of cells in the row
- // (one on the left, the other on the right),
- // flip the pixels in the individual cells
- // and swap the cells with oneanother.
- for ( cellPtr1 = aRow + numCells - 1, cellPtr2 = aRow;
- cellPtr1 > cellPtr2;
- cellPtr1--, cellPtr2++)
- {
- temp = ((UCHAR*)cellPtr1)[0];
- ((UCHAR*)cellPtr1)[0] =
- flipTable[((UCHAR*)cellPtr2)[1]];
- ((UCHAR*)cellPtr2)[1] = flipTable[temp];
-
- temp = ((UCHAR*)cellPtr1)[1];
- ((UCHAR*)cellPtr1)[1] =
- flipTable[((UCHAR*)cellPtr2)[0]];
- ((UCHAR*)cellPtr2)[0] = flipTable[temp];
- }
-
- // If there's an odd number of cells in the row,
- // there is one cell we haven't touched.
- // It needs to be flipped.
- if (cellPtr1 == cellPtr2)
- {
- temp = ((UCHAR*)cellPtr1)[0];
- ((UCHAR*)cellPtr1)[0] =
- flipTable[((UCHAR*)cellPtr1)[1]];
- ((UCHAR*)cellPtr1)[1] =
- flipTable[temp];
- }
-
- // Slide the pixels to the left
- for ( shiftCellPtr = aRow;
- shiftCellPtr < aRow + rowCells;
- shiftCellPtr++)
- {
- // shift the bits over
- *shiftCellPtr <<= numBitsToShift;
-
- // bring in the bits from the next cell -
- // garbage will be brought in during last
- // iteration, but its put into the last
- // cell, outside the bounds of the image
- // (but still in the data area)
- *shiftCellPtr |= shiftMask &
- (*(shiftCellPtr+1) >>
- (sizeof(T)*8 - numBitsToShift));
- }
- }
- }
- else // no need to shift pixels, otherwise,
- { // just the same as previous loop
- for ( aRow = firstRow; aRow < lastRow; aRow += rowCells)
- {
- // With each pair of cells in the row (one on the
- // left, the other on the right), flip the pixels
- // in the individual cells and swap the cells with
- // one another.
- for ( cellPtr1 = aRow + numCells - 1, cellPtr2 = aRow;
- cellPtr1 > cellPtr2;
- cellPtr1--, cellPtr2++)
- {
- temp = ((UCHAR*)cellPtr1)[0];
- ((UCHAR*)cellPtr1)[0] =
- flipTable[((UCHAR*)cellPtr2)[1]];
- ((UCHAR*)cellPtr2)[1] = flipTable[temp];
-
- temp = ((UCHAR*)cellPtr1)[1];
- ((UCHAR*)cellPtr1)[1] =
- flipTable[((UCHAR*)cellPtr2)[0]];
- ((UCHAR*)cellPtr2)[0] = flipTable[temp];
- }
-
- // If there are an odd number of cells in the row,
- // there is one cell we haven't touched.
- // It needs to be flipped.
- if (cellPtr1 == cellPtr2)
- {
- temp = ((UCHAR*)cellPtr1)[0];
- ((UCHAR*)cellPtr1)[0] =
- flipTable[((UCHAR*)cellPtr1)[1]];
- ((UCHAR*)cellPtr1)[1] = flipTable[temp];
- }
- }
- }
- }
-